package testInterview;

public class FinalData {
    public static final String [][] TOPIC_MYBATIS = {
            {"1、#和$的区别"},
            {"2、MyBatis的xml文件中，不同的xml映射文件，id是否可以重复？"},
            {"3、MyBatis的优缺点"},
            {"4、什么是MyBatis"}
    };

    public static final String [][] ANSWER_MYBATIS = {
            {"#是占位符，$是拼接符，#对应的变量自动添加单引号，$对应的变量不添加单引号，#能防止SQL注入，$不能防止SQL注入。"},
            {"不同的xml映射文件，namespace不同，id可以相同。"},
            {"优点：\n" +
                    "1.基于SQL语句编程，相当灵活，不会对应用程序或者数据库的现有设计造成任何影响。SQL写在xml里面，解除SQL与程序代码的耦合，便于统一管理。\n" +
                    "2.与jdbc相比，消除大量冗余代码，不需要手动开关连接。\n" +
                    "3.很好的与各种数据库兼容。\n" +
                    "4.与spring很好的集成。\n" +
                    "缺点：\n" +
                    "1.SQL语句的编写工作量较大，尤其当字段多，关联表多时，对开发人员编写SQL语句的能力有一定要求。\n" +
                    "2.SQL语句依赖数据库，导致数据库移植性差，不能随意更换数据库。"},
            {"MyBatis是一个半ORM框架，内部封装了jdbc，加载驱动，创建连接，创建statement等繁杂的过程，开发者开发时只需要关注如何编写SQL语句，\n" +
                    "可以严格控制SQL执行性能，灵活度高。"}
    };

    public static final String [][] TOPIC_MYSQL = {
            {"1、SQL语句的执行顺序："},
            {"2、索引的用处："},
            {"3、主键、外键、索引的区别"},
            {"4、join的几种用法"},
            {"5、MySQL数据库优化的方式："},
            {"6、InnoDB和MyIsam的区别："},
            {"7、建立索引的情况："},
            {"8、索引失效"},
    };

    public static final String [][] ANSWER_MYSQL = {
            {"from where group by having select order by"},
            {"优点：加快数据的检索速度。加速表与表之间的连接。创建唯一性索引，使数据库中的每条数据具有唯一性。\n" +
                    "缺点：索引占用物理内存。增删改的时候也需要对索引进行维护，降低了数据的维护速度。"},
            {"主键：用来唯一标识一条记录，不能为空，不能重复。\n" +
                    "外键：另一张表的主键，可以重复，可以为空。\n" +
                    "索引：该字段不能重复，但可以有一个空值。"},
            {"left join：左连接，左表中的全部记录以及右表中连接字段相等的记录。\n" +
                    "right join：右连接，右表中的全部记录以及坐标中连接字段相等的记录。\n" +
                    "inner join：内连接，返回连接字段相等的记录。\n" +
                    "full join：外连接，返回两个表中的行，相当于left join + right join。"},
            {"1、选取最适用的字段属性。\n" +
                    "2、使用连接来代替子查询。\n" +
                    "3、锁定表。\n" +
                    "4、使用外键。\n" +
                    "5、使用索引。\n" +
                    "6、优化查询语句。\n" +
                    "7、使用联合union来代替手动创建的临时表。"},
            {"1、InnoDB支持事务，MyIsam不支持事务。\n" +
                    "2、InnoDB支持外键，MyIsam不支持外键。\n" +
                    "3、InnoDB不支持全文搜索，MyIsam支持全文搜索。\n" +
                    "4、InnoDB必须要有一个唯一索引，例如主键，MyIsam可以没有主键。\n" +
                    "5、InnoDB支持表级锁和行级锁，MyIsam只支持表级锁。\n" +
                    "6、InnoDB存储文件有frm，idb。MyIsam存储文件有frm，myd，myi。"},
            {"适合建立索引的情况：\n" +
                    "1.主键自动建立唯一索引。\n" +
                    "2.频繁作为查询条件的字段应该建立索引。\n" +
                    "3.查询中与其他表关联的字段，外键建立索引。\n" +
                    "不适合建立索引的情况\n" +
                    "1.表记录太少。\n" +
                    "2.经常增删改的表。\n" +
                    "3.在where条件里面用不到的字段不创建索引。\n" +
                    "4.过滤性不好的字段不创建索引。"},
            {"1.like的模糊查询以%开头，索引失效。\n" +
                    "2.如果MySQL预计使用全表扫描要比使用索引快，则不需要建立索引。\n" +
                    "3.对索引列进行运算。"},
    };

    public static final String [][] TOPIC_SPRINGBOOT = {
            {"1、springboot的三种运行方式"},
            {"2、SpringBootApplication注解"},
    };

    public static final String [][] ANSWER_SPRINGBOOT = {
            {"1.运行带有main方法的主类。\n" +
                    "2.通过命令行方式运行java -jar。\n" +
                    "3.通过spring-boot-plugin的方式。"},
            {"SpringBootApplication注解是一个复合注解，包含了SpringBootConfiguration，EnableAutoConfiguration，ComponentScan是三个注解。"},
    };

    public static final String [][] TOPIC_SPRINGMVC = {
            {"1、SpringMVC的执行流程"},
            {"2、SpringMVC的控制注解一般用哪个"},
            {"3、SpringMVC的常用注解有哪些？"},
            {"4、SpringMVC的优点"},
            {"5、什么是SpringMVC"},
    };

    public static final String [][] ANSWER_SPRINGMVC = {
            {"1.用户点击一个请求路径，发起一个http request请求。该请求会提交到DispatcherServlet（前端控制器）。\n" +
                    "2.由DispatcherServlet请求一个或多个HandlerMapping（处理器映射器），并返回一个执行链。\n" +
                    "3.DispatcherServlet将返回的Handler信息发送给HandlerAdapter（处理器适配器）。\n" +
                    "4.HandlerAdapter根据Handler信息找到并执行相应的Handler（常称为controller）。\n" +
                    "5.Handler执行完毕后会返回给HandlerAdapter一个ModelAndView对象（SpringMVC的底层对象，包括model数据模型和view视图信息）。\n" +
                    "6.HandlerAdapter接收到ModelAndView对象后将其返回给DispatcherServlet。\n" +
                    "7.DispatcherServlet接收到ModelAndView对象后，会请求ViewResolver（视图解析器）对视图进行解析。\n" +
                    "8.ViewResolver会根据view信息匹配到相应的视图结果，并返回给DispatcherServlet。\n" +
                    "9.DispatcherServlet接收到具体的view视图后，进行数据渲染，将model中的模型数据填充到view视图中的request域，生成最终的view（视图）。\n" +
                    "10.视图负责将结果显示到浏览器（客户端）。"},
            {"一般使用@Controller注解，也可以使用@RestController，就相当于@ResponseBody+@Controller，\n" +
                    "表示是表现层，除此之外，一般不使用别的注解。"},
            {"1.@RequestMapping：用于处理 请求URL映射 的注解，可以用在类或者方法上。用于类上，表示类中所有的响应方法都是以这个路径为父路径。\n" +
                    "2.@RequestBody：注解实现接收http请求的JSON数据，将JSON数据转化为java对象。\n" +
                    "3.@ResponseBody：注解实现将controller方法返回对象转化为JSON对象响应给客户。"},
            {"1.支持各种视图技术，而不仅仅局限于jsp。\n" +
                    "2.与spring容器集成（如IOC容器，aop等）。\n" +
                    "3.清晰的角色分配：前端控制器（DispatcherServlet），处理器映射器（HandlerMapping），\n" +
                    "处理器适配器（HandlerAdapter），视图解析器（ViewResolver）。\n" +
                    "4.支持各种请求资源的映射策略。"},
            {"SpringMVC是一个基于MVC架构的用来简化web应用程序开发的轻量级开发框架，通过把model，view，controller分离，将web层进行解耦。\n" +
                    "把复杂的web应用分成逻辑清晰的几部分，简化开发，减少出错，方便组内人员之间的配合。"},
    };

    public static final String [][] TOPIC_SPRING = {
            {"1、bean的作用域"},
            {"2、BeanFactory和FactoryBean的区别："},
            {"3、servlet生命周期"},
            {"4、spring框架的好处"},
            {"5、依赖注入DI："},
            {"6、IOC控制反转"},
    };

    public static final String [][] ANSWER_SPRING = {
            {"可以通过scope属性来指定bean的作用域\n" +
                    "1.singleton，默认值。当IOC容器一创建就会创建bean实例，而且是单例的，每次都是同一个。\n" +
                    "2.prototype，原型的，当IOC容器创建时不会实例化该bean，每次调用getBean方法时再实例化该bean，每次得到的bean都是不同的。\n" +
                    "3.request，每次请求实例化一个bean。\n" +
                    "4.session，在一次会话中共享一个bean。"},
            {"1.BeanFactory，以factory结尾，表示它是一个工厂类，是一个管理bean的工厂。在spring中，BeanFactory是IOC容器中的一个核心接口，\n" +
                    "他的职责包括实例化，配置程序中的对象以及建立这些对象间的依赖。\n" +
                    "2.FactoryBean，以bean结尾，表示它是一个bean，不同于普通bean的是，它是实现了FactoryBean接口的bean。"},
            {"分为三个阶段：\n" +
                    "1.初始化阶段，调用init方法。\n" +
                    "2.响应客户端阶段，调用service方法。\n" +
                    "3.终止阶段，调用destroy方法。"},
            {"1.非侵入式，支持基于pojo的变成模式，不强制性的要求实现spring框架中的接口或继承spring中的类。\n" +
                    "2.IOC容器，IOC容器帮助应用程序管理对象和对象之间的关系，对象之间的关系如果发生了变化，只需要修改配置文件而不需要修改代码，\n" +
                    "因为代码的修改可能意味着重新构建和完整的回归测试。有了IOC容器，程序员也不需要自己编写工厂，单例。这点很符合spring的精神不重复发明轮子。\n" +
                    "3.AOP，将所有的横切关注功能封装到切面中，通过配置方式将很切关注功能动态添加到代码上，进一步实现了业务逻辑和系统服务之间的分离。\n" +
                    "另一方面，有了AOP程序员可以省去很多自己写代理类的工作。\n" +
                    "4.MVC，spring的MVC框架为web层提供了更好的解决方案。\n" +
                    "5.事务管理，spring接收多种持久层技术，并且为其提供了声明式的事务管理，在不需要任何一行代码的情况下就能完成事务管理。"},
            {"指bean之间的依赖注入，设置对象之间的级联关系，也就是把IOC中的另一个bean赋值给当前成员变量。"},
            {"是一种设计思想，就是将设计好的对象交给容器控制，而不是显式的用代码进行对象的创建。把创建和查找依赖对象的控制权交给IOC容器，\n" +
                    "由IOC容器进行注入，组合对象，这样对象与对象之间是松耦合，便于测试。"},
    };
}
